Amazon DynamoDBテーブルと テーブルにレコードを追加する AWS Lambda 関数を作成するための AWS CloudFormation テンプレート

Amazon DynamoDBテーブルと テーブルにレコードを追加する AWS Lambda 関数を作成するための AWS CloudFormation テンプレート

Clock Icon2023.07.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

概要

このブログでは、Amazon DynamoDB テーブルと AWS Lambda 関数を作成する CloudFormation テンプレートを設計します。 Amazon DynamoDB テーブルには、Primaryキーとして「item_code」属性を持つアイテムが保存されます。 AWS Lambda 関数は、「item_code」に基づいて重複を防ぐための条件付きチェックを使用して、DynamoDB テーブルに新しい項目を追加するために割り当てられます。 AWS Lambda 関数は Python 3.8 で記述されており、AWS SDK (Boto3) を利用して Amazon DynamoDB と通信します。

CloudFormation テンプレート

AWSTemplateFormatVersion: '2010-09-09'
Description: CloudFormation template for creating Lambda function to put_item in a DynamoDB table
Resources:
  DynamoDBItemsTable:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: DynamoDBItemsTable
      AttributeDefinitions:
        - AttributeName: item_code
          AttributeType: S
      KeySchema:
        - AttributeName: item_code
          KeyType: HASH
      BillingMode: PAY_PER_REQUEST
  LambdaExecutionRole:
    Type: 'AWS::IAM::Role'
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: lambda.amazonaws.com
            Action: 'sts:AssumeRole'
      Policies:
        - PolicyName: DynamoDBAccess
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action:
                  - dynamodb:PutItem
                  - dynamodb:GetItem
                Resource: !GetAtt DynamoDBItemsTable.Arn

  LambdaFunction:
    Type: AWS::Lambda::Function
    Properties:
      FunctionName: items_put
      Runtime: python3.8
      Handler: index.lambda_handler
      Role: !GetAtt LambdaExecutionRole.Arn
      Code:
        ZipFile: |
          import json
          import boto3

          dynamodb = boto3.resource('dynamodb')
          table = dynamodb.Table('DynamoDBItemsTable')

          def lambda_handler(event, context):

              if not event.get("item_code"):
                  return {
                      'statusCode': 400,
                      'body': 'Input must contain item_code'
                  }

              item_code = event.get('item_code')
              try:
                  table.put_item(Item=event, ConditionExpression='attribute_not_exists(item_code)')
                  return {
                      'statusCode': 200,
                      'body': 'Item added successfully'
                  }
              except dynamodb.meta.client.exceptions.ConditionalCheckFailedException:
                  return {
                      'statusCode': 400,
                      'body': 'Item with item_code already exists'
                  }

リソース

  • DynamoDBItemsTable: Primary キー「item_code」(String) と請求モードを「PAY_PER_REQUEST」に設定して Amazon DynamoDB テーブルを作成します。
  • LambdaExecutionRole: AWS Lambda 関数の IAM ロールを定義し、「DynamoDBItemsTable」へのデータの読み書きを許可します。
  • LambdaFunction: Python 3.8 ランタイムで AWS Lambda 関数「items_put」を作成します。この関数は、重複を避けるためのConditionチェックを使用してitemsを Amazon DynamoDB テーブルに追加します。

CloudFormationスタックをデプロイする

  • AWS CloudFormation テンプレートを使用してスタックを作成します。
  • 次のコマンドを使用してスタックをデプロイします。スタック名と AWS CloudFormation テンプレート ファイルへのパスを指定します。
aws cloudformation create-stack --stack-name dynamodb-putitems-stack --template-body file://ddb_items_put.yaml --capabilities CAPABILITY_NAMED_IAM --profile <YOUR_AWS_PROFILE_NAME> --region ap-northeast-1

ノート: 次の値を、AWS 環境に一致する実際の値に置き換えてください。

  • stack-name
  • template-body「例えば、file://XXXX」
  • profile
  • region

テスト

  • CloudFormationスタックが正常に作成されたことを確認します。

  • 「Resources」タブをクリックして、作成されたリソースを確認します。

  • 作成されたAWS Lambda関数「items_put」を次のJSON入力イベントでテストします。
{
  "item_code": "B0C2BSVMTZ",
  "item_name": "おーいお茶",
  "price": 2066
}
  • Amazon DynamoDB テーブルにレコードが正常に追加されました。

まとめ

このブログでは、AWS CloudFormation を正常に作成およびデプロイして、AmazonDynamoDB テーブルと AWS Lambda 関数を作成しました。 AWS Lambda 関数には、重複項目の追加を防ぐための条件式が含まれています。全体として、このアプローチはサーバーレス・アプリケーションを管理するための効率的で費用対効果の高いソリューションを提供します。

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.